package com.exonline.commons.dao;
/**
 * @desc    持久层接口
 * @author  hbrj
 */

import org.apache.commons.dbutils.ResultSetHandler;
import java.sql.SQLException;
import java.util.List;

public interface IDao<T> {

    /**
     * @desc  1.查询获取一条数据
     * @param sql SQL 语句
     * @param handler 结果集处理器:例如：new BeanHandler<>(Student.class)即查询Student表中的一条数据
     * @param params 参数：占位符参数，在执行查询一条数据时候则必须要写参数
     * @return 查询结果
     * @throws SQLException 如果执行失败
     */
    <T> T queryForObject(String sql, ResultSetHandler<T> handler, Object... params) throws SQLException;

    /**
     * @desc  2.查询多条数据(查询多条数据+分页查询+条件查询)
     * @param baseSql 基础 SQL 语句
     * @param conditions 条件列表：例如："age>10  and name like ?"
     * @param handler 结果集处理器:例如：new BeanListHandler<>(Student.class):即将结果ResultSet转变为List<Student>
     * @param params 参数：占位符参数：如果不写，即不传参，本次执行是查询全部
     * @return 查询结果
     * @throws SQLException 如果执行失败
     */
    <T> List<T> queryWithPagingAndConditions(String baseSql, String conditions, int pageNum,int pageSize,ResultSetHandler<List<T>> handler, Object... params) throws SQLException;


    /**
     * @desc  3.查询一共有多少条数据
     */
    int queryCount(String sql, Object... params) throws SQLException;

    /**
     * @desc  4.执行带有事务的更新操作
     * @param sql SQL 语句
     * @param params 参数
     * @return 受影响的行数
     * @throws SQLException 如果执行失败
     */
    int updateWithTransaction(String sql, Object... params) throws SQLException;

    /**
     * @desc  5.执行带有事务的多个更新操作
     * @param sqls SQL 语句数组
     * @param params 参数数组
     * @return 每个 SQL 语句受影响的行数数组
     * @throws SQLException 如果执行失败
     */
    int[] batchUpdateWithTransaction(String[] sqls, Object[][] params) throws SQLException;
}
